#include <iostream>
#include <fstream>
//~ #include <string>
//~ #include <cstdio>
//~ #include <cstring>
//~ #include <cctype>
//~ #include <cmath>
//~ #include <cstdlib>

using namespace std;

#ifndef __TCalendario__
#define __TCalendario__


class TCalendario
{
    //FUNCIONES AMIGAS
    // Sobrecarga del operador salida
    friend ostream & operator<<(ostream &,const TCalendario &);

    public:
        // FORMA CANÓNICA
        //Constructor por defecto : inicializa dia, mes y anyo a 1 de 1 del 1900 y mensaje a NULL
        TCalendario ();
        //Constructor que inicializa calendario con parámetros pasados
        TCalendario(int, int, int, char *);
        //Constructor copia
        TCalendario (const TCalendario &);
        //Destructor
        ~TCalendario();
        // Sobrecarga del operador asignación
        TCalendario & operator=(const TCalendario &);

        // MÉTODOS
        // Sobrecarga del operador SUMA de fecha + un número de dias;
        TCalendario operator+(int);
        // Sobrecarga del operador RESTA de fecha - un número de dias;
        TCalendario operator-(int);
        // Modifica la fecha incrementandola en un dia (con postincremento);
        TCalendario operator++(int)const;
        // Modifica la fecha incrementandola en un dia (con preincremento);
        TCalendario &operator++();
        // Modifica la fecha decrementándola en un dia (con postdecremento);
        TCalendario operator--(int)const;
        // Modifica la fecha decrementándola en un día (con predecremento);
        TCalendario &operator--();
        // Modifica la fecha
        bool ModFecha (int, int, int);
        // Modifica el mensaje
        bool ModMensaje(char *);
        // Sobrecarga del operador igualdad;
        bool operator ==(const TCalendario &)const;
        // Sobrecarga del operador desigualdad;
        bool operator !=(const TCalendario &)const;
        // Sobrecarga del operador >; (ver ACLARACIÓN sobre ORDENACIÓN)
        bool operator>(const TCalendario &)const;
        // Sobrecarga del operador <; (ver ACLARACIÓN sobre ORDENACIÓN)
        bool operator<(const TCalendario &)const;
        //TCalendario vacío
        bool EsVacio()const;
        // Devuelve el día del calendario;
        int Dia()const;
        // Devuelve el mes del calendario;
        int Mes()const;
        // Devuelve el año del calendario;
        int Anyo()const;
        // Devuelve el mensaje del calendario;
        char *Mensaje()const;

    private:
        int dia;
        int mes;
        int anyo;
        char* mensaje;
};


#endif
